package com.mjk.common.core.redis.datatype;

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.SetOperations;

import java.util.Set;
/**
 * redis set 工具类
 * SADD key member1 [member2 ...]：向集合中添加一个或多个成员。
 * SREM key member1 [member2 ...]：从集合中移除一个或多个成员。
 * SMEMBERS key：返回集合中的所有成员。
 * SISMEMBER key member：判断成员是否在集合中。
 * SCARD key：返回集合中的成员数。
 * SPOP key [count]：随机地移除并返回集合中的一个或多个成员。
 * SRANDMEMBER key [count]：随机地返回集合中的一个或多个成员，但不移除它们。
 * SDIFF key1 [key2 ...]：返回给定集合之间的差集。
 * SINTER key1 [key2 ...]：返回给定集合之间的交集。
 * SUNION key1 [key2 ...]：返回给定集合之间的并集。
 * @author mjk
 *
 */
public class RedisSetUtils {
	/**
     * @description 添加元素
     */
    
    public static long add(RedisTemplate<String, Object> redisTemplate,String key, Object...values) {
        SetOperations<String, Object> oper = redisTemplate.opsForSet();
        Long value = oper.add(key, values);
        if(null == value){
            return -1;
        }
        return value;
    }
    
    /**
     * @description 找出两个集合不同的部分，并进行遍历
     */    
    public static Set<Object> diff(RedisTemplate<String, Object> redisTemplate,String key, String otherKey)
    {
        SetOperations<String, Object> oper = redisTemplate.opsForSet();
        return oper.difference(key,otherKey);
    }
    
    /**
     * @description  找出两个集合不同的部分，并存到destKey集合中
     */    
    public static long diddStore(RedisTemplate<String, Object> redisTemplate,String destKey, String key, String otherKey)
    {
        SetOperations<String, Object> oper = redisTemplate.opsForSet();
        Long value = oper.differenceAndStore(key, otherKey, destKey);
        if(null == value){
            return -1;
        }
        return value;
    }
    
    /**
     * @description 找出两个集合的相同部分，并进行遍历
     */    
     public static  Set<Object> inter(RedisTemplate<String, Object> redisTemplate,String key, String otherKey){
       SetOperations<String, Object> oper = redisTemplate.opsForSet();
       return  oper.intersect(key, otherKey);
    }
    
    /**
     * @description 找出两个集合的相同部分，存到新集合destKey中
     */    
    public static void interStore(RedisTemplate<String, Object> redisTemplate,String destKey, String key, String otherKey)
    {
        SetOperations<String, Object> oper = redisTemplate.opsForSet();
        oper.intersectAndStore(key, otherKey, destKey);
    }
    
    /** 
     * @description  找出兩個集合的并集，并進行遍歷
     */    
    public static Set<Object> union(RedisTemplate<String, Object> redisTemplate,String key, String otherKey)
    {
        SetOperations<String, Object> oper = redisTemplate.opsForSet();
        return oper.union(key, otherKey);
    }
    
    /**
     * @description 找出兩個集合的并集，并存放到新集合destKey中
     */    
    public static long unionStore(RedisTemplate<String, Object> redisTemplate,String destKey, String key, String otherKey)
    {
        SetOperations<String, Object> oper = redisTemplate.opsForSet();
        Long value = oper.unionAndStore(key, otherKey, destKey);
        if(null == value){
            return -1;
        }
        return value;
    }

    /**
     * @description  无序集合，随机移除一个元素
     */    
    public static Object pop(RedisTemplate<String, Object> redisTemplate,String key)
    {
        SetOperations<String, Object> oper = redisTemplate.opsForSet();
        return oper.pop(key);        
    }
    
    /**
     * @description 根据给定的元素，去移除
     */    
    public static void remove(RedisTemplate<String, Object> redisTemplate,String key, String...values)
    {
        SetOperations<String, Object> oper = redisTemplate.opsForSet();
        oper.remove(key, (Object[])values);
    }
    
    /**
     * @description 获取集合长度
     */
    
    public static long size(RedisTemplate<String, Object> redisTemplate,String key)
    {
        SetOperations<String, Object> oper = redisTemplate.opsForSet();
        Long value =oper.size(key);
        if(null == value){
            return -1;
        }
        return value;
    }
    
    /**
     * @description    遍历整个集合
     */    
    public static Set<Object> smembers(RedisTemplate<String, Object> redisTemplate,String key)
    {    
       SetOperations<String, Object> oper = redisTemplate.opsForSet();
       return oper.members(key);
    }

}
